home *** CD-ROM | disk | FTP | other *** search
/ Shareware Extravaganza - Disc 1 / ShareWare Extravaganza 1 of 4 (The Ultimate Shareware Company).iso / grprogs / picutil.exe / MOVE.ASM < prev    next >
Assembly Source File  |  1986-06-05  |  20KB  |  603 lines

  1. ;╔═════════════════════════════════════════════════════════════════════════════╗
  2. ;║ ░░░░░░░░░░░ PROGRAM = MOVE.ASM ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  3. ;╚═════════════════════════════════════════════════════════════════════════════╝
  4. CSEG           SEGMENT PUBLIC BYTE
  5.            ASSUME  CS:CSEG,DS:CSEG
  6.  
  7. CR           EQU     0DH
  8. LF           EQU     0AH
  9.  
  10. FILENAME       DB      128 DUP (0)
  11. HANDLE_IN      DW      0
  12. TYPE_FROM      DW      0               ;POINTS TO TYPE IN FILENAME
  13. OPTIONS        DB      128 DUP(0)           ;OPTIONS
  14.  
  15. UP           DW      0
  16. DOWN           DW      0
  17. RIGHT           DW      0
  18. LEFT           DW      0
  19. DISK_BUFFER    DD      0               ;DISK BUFFER OFFSET
  20.                            ;DISK BUFFER SEGMENT
  21.  
  22. ;44 BYTES
  23. IMG_NAME       DB      '                              '
  24. IMG_HEIGHT     DW      0
  25. IMG_WIDTH      DW      0
  26. IMG_WIDTH_BYTE DW      0
  27. IMG_PIX_SIZE   DW      1
  28. IMG_PIX_FMT    DW      0
  29. IMG_COLOR      DW      0
  30. IMG_COMPRESS   DW      0
  31.  
  32. READ_POINTER   DW      44
  33.            DW      0
  34. WRITE_POINTER  DW      44
  35.            DW      0
  36. BYTE_ADJUST    DW      0
  37. EIGHT           DW      8
  38.  
  39. IMG           DB      'IMG',0
  40.  
  41. TELL_HOW       DB      '┌─────────────────────────────────────────────────────────────┐',cr,lf
  42.            DB      '│syntax = MOVE filename.IMG [u#],[d#],[r#],[l#]               │',cr,lf
  43.            DB      '├─────────────────────────────────────────────────────────────┤',cr,lf
  44.            DB      '│filename.typ = name of image file....must have correct type  │',cr,lf
  45.            DB      '├─────────────────────────────────────────────────────────────┤',cr,lf
  46.            DB      '│   u#  = Number of pixels to move image up in file           │',CR,LF
  47.            DB      '│   d#  = Number of pixels to move image down in file         │',CR,LF
  48.            DB      '│   r#  = Number of pixels to move image right in file        │',CR,LF
  49.            DB      '│   l#  = Number of pixels to move image left in file         │',CR,LF
  50.            DB      '│    #  = (0 to 65535)                                        │',CR,LF
  51.            DB      '└─────────────────────────────────────────────────────────────┘',cr,lf
  52.            DB      7,'$'
  53. OPEN_ERROR     DB      'open error on input file',cr,lf,'$'
  54. CREATE_ERROR   DB      'create error on output file',cr,lf,'$'
  55. TYPE_ERROR     DB      'error in type of input file',cr,lf
  56.            Db      'must be IMG',cr,lf,'$'
  57. NOT_IMP        DB      'NOT IMPLIMENTED YET',CR,LF,'$'
  58. SIZE_ERROR     DB      'pixels to move exceed number of pixels in file',cr,lf,'$'
  59. ;╔═════════════════════════════════════════════════════════════════════════════╗
  60. ;║ ░░░░░░░░░░░ MOVE.ASM ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  61. ;╚═════════════════════════════════════════════════════════════════════════════╝
  62. MOVE           PROC    FAR
  63. ;┌─────────────────────────────────────────────────────────────────────────────┐
  64. ;│           RETURN SETUP                               │
  65. ;└─────────────────────────────────────────────────────────────────────────────┘
  66.            CLD
  67.            CLI
  68.            MOV     AX,CS               ;TEMP STACK
  69.            MOV     SS,AX               ;
  70.            MOV     ES,AX               ;
  71.            MOV     SP,OFFSET STACK           ;
  72.            STI
  73.            PUSH    DS               ;
  74.            XOR     AX,AX               ;
  75.            PUSH    AX               ;
  76. ;┌─────────────────────────────────────────────────────────────────────────────┐
  77. ;│           GET FILENAME FROM COMMAND LINE                       │
  78. ;└─────────────────────────────────────────────────────────────────────────────┘
  79.            MOV     SI,82H               ;START OF FILENAME
  80.            XOR     CH,CH               ;
  81.            MOV     CL,DS:[SI-2]           ;SIZE OF FILENAME
  82.            CMP     CX,0               ;NO COMMANDS
  83.            JE      GFN800               ;ERROR
  84.            MOV     DI,OFFSET FILENAME      ;STORE FILENAME HERE
  85. GFN100:
  86.            LODSB                   ;GET CHARACTER
  87.            CMP     AL,20H               ;END OF FILENAME?
  88.            JE      GFN700               ;YES....BRANCH
  89.            CMP     AL,CR               ;END OF COMMAND LINE?
  90.            JE      GFN800               ;YES....ERROR
  91.            STOSB                   ;SAVE CHARACTER
  92.            CMP     AL,'.'                  ;START OF TYPE
  93.            JNE     GFN200               ;
  94.            MOV     CS:TYPE_FROM,DI           ;START OF TYPE
  95. GFN200:
  96.            LOOP    GFN100               ;GET ANOTHER CHARACTER
  97.            JMP     SHORT GFN800           ;ERROR IF DONE ALREADY
  98. GFN300:
  99.            LODSB                   ;GET CHARACTER
  100.            CMP     AL,CR               ;END OF COMMAND LINE?
  101.            JE      GFN900               ;YES....ERROR
  102.            CMP     AL,'a'
  103.            JB      GFN400
  104.            CMP     AL,'z'
  105.            JA      GFN400
  106.            AND     AL,0DFH               ;CONVERT TO UPPER CASE
  107. GFN400:
  108.            STOSB                   ;SAVE CHARACTER
  109.            LOOP    GFN300               ;GET ANOTHER CHARACTER
  110.            JMP     SHORT GFN800           ;ERROR IF DONE
  111. GFN700:                        ;
  112.            MOV     AL,0               ;
  113.            STOSB                   ;
  114.            MOV     DI,OFFSET OPTIONS       ;
  115.            LOOP    GFN300
  116. GFN800:
  117.            MOV     DX,OFFSET TELL_HOW      ;
  118.            JMP     ERROR               ;
  119. GFN900:
  120.            MOV     AL,0               ;PUT NULL AT END OF STRING
  121.            STOSB                   ;
  122.            CMP     WORD PTR CS:TYPE_FROM,0 ;
  123.            JE      GFN800               ;ERROR
  124. ;┌─────────────────────────────────────────────────────────────────────────────┐
  125. ;│           FIND DISK MEMORY                            │
  126. ;└─────────────────────────────────────────────────────────────────────────────┘
  127.            MOV     AX,OFFSET PROG_END      ;
  128.            MOV     BX,CS               ;
  129.            MOV     DS,BX
  130.            SHR     AX,1               ;
  131.            SHR     AX,1               ;
  132.            SHR     AX,1               ;
  133.            SHR     AX,1               ;
  134.            ADD     BX,AX               ;
  135.            INC     BX               ;
  136.            MOV     WORD PTR DISK_BUFFER+2,BX      ;
  137. ;┌─────────────────────────────────────────────────────────────────────────────┐
  138. ;│           CHECK FOR CORRECT FILE TYPE                       │
  139. ;└─────────────────────────────────────────────────────────────────────────────┘
  140.            MOV     SI,OFFSET IMG           ;CHANGE TYPE ON FILENAME
  141.            MOV     DI,TYPE_FROM           ;
  142.            MOV     CX,3               ;
  143.            AND     BYTE PTR [DI],0DFH        ;MAKE CAPITOL LETTER
  144.            AND     BYTE PTR [DI+1],0DFH        ;MAKE CAPITOL LETTER
  145.            AND     BYTE PTR [DI+2],0DFH        ;MAKE CAPITOL LETTER
  146.            REP     CMPSB               ;
  147.            JNE     OIF050
  148. ;┌─────────────────────────────────────────────────────────────────────────────┐
  149. ;│           OPEN INPUT FILE                               │
  150. ;└─────────────────────────────────────────────────────────────────────────────┘
  151.            MOV     AH,3DH               ;OPEN FILE FOR READ/WRITE
  152.            MOV     AL,2H               ;
  153.            MOV     DX,OFFSET FILENAME      ;
  154.            INT     21H               ;
  155.            JNC     OIF100
  156. OIF050:
  157.            MOV     DX,OFFSET OPEN_ERROR    ;
  158.            JMP     ERROR
  159. OIF100:
  160.            MOV     HANDLE_IN,AX
  161. ;┌─────────────────────────────────────────────────────────────────────────────┐
  162. ;│           CHECK FOR OPTIONS                           │
  163. ;└─────────────────────────────────────────────────────────────────────────────┘
  164.            MOV     SI,OFFSET OPTIONS
  165. OPT100:
  166.            LODSB
  167.            CMP     AL,0               ;END OF OPTIONS?
  168.            JE      OPT900               ;YES GO ON
  169.            AND     AL,0DFH
  170.  
  171.            CMP     AL,'U'                  ;UP
  172.            JNE     OPT200
  173.            CALL    GET_NUMBER
  174.            MOV     UP,AX
  175.            JMP     SHORT OPT100
  176. OPT200:
  177.            CMP     AL,'D'                  ;DOWN
  178.            JNE     OPT300
  179.            CALL    GET_NUMBER
  180.            MOV     DOWN,AX
  181.            JMP     SHORT OPT100
  182. OPT300:
  183.            CMP     AL,'R'                  ;DOWN
  184.            JNE     OPT400
  185.            CALL    GET_NUMBER
  186.            MOV     RIGHT,AX
  187.            JMP     SHORT OPT100
  188. OPT400:
  189.            CMP     AL,'L'                  ;LEFT
  190.            JNE     OPT100
  191.            CALL    GET_NUMBER
  192.            MOV     LEFT,AX
  193.            JMP     SHORT OPT100
  194. OPT900:
  195. ;┌─────────────────────────────────────────────────────────────────────────────┐
  196. ;│           CHECK FOR REDUNDANCE                           │
  197. ;└─────────────────────────────────────────────────────────────────────────────┘
  198.            CMP     UP,0               ;MAKE SURE UP OR DOWN IS ZERO
  199.            JE      CHK200
  200.            CMP     DOWN,0
  201.            JE      CHK200
  202.            MOV     AX,UP
  203.            CMP     AX,DOWN
  204.            JA      CHK100
  205.            SUB     DOWN,AX
  206.            MOV     UP,0
  207.            JMP     SHORT CHK200
  208. CHK100:
  209.            SUB     AX,DOWN
  210.            MOV     DOWN,0
  211.            MOV     UP,AX
  212. CHK200:
  213.            CMP     RIGHT,0
  214.            JE      CHK900
  215.            CMP     LEFT,0
  216.            JE      CHK900
  217.            MOV     AX,RIGHT
  218.            CMP     AX,LEFT
  219.            JA      CHK300
  220.            SUB     LEFT,AX
  221.            MOV     RIGHT,0
  222.            JMP     SHORT CHK900
  223. CHK300:
  224.            SUB     AX,LEFT
  225.            MOV     LEFT,0
  226.            MOV     RIGHT,AX
  227. CHK900:
  228. ;┌─────────────────────────────────────────────────────────────────────────────┐
  229. ;│           READ IMG HEADER                               │
  230. ;└─────────────────────────────────────────────────────────────────────────────┘
  231.            MOV     AH,3FH
  232.            MOV     BX,HANDLE_IN
  233.            MOV     CX,44
  234.            MOV     DX,OFFSET IMG_NAME
  235.            INT     21H
  236. ;┌─────────────────────────────────────────────────────────────────────────────┐
  237. ;│           CHECK FOR SIZE                               │
  238. ;└─────────────────────────────────────────────────────────────────────────────┘
  239.            MOV     AX,IMG_WIDTH
  240.            CMP     LEFT,AX
  241.            JAE     CHK950
  242.            CMP     RIGHT,AX
  243.            JAE     CHK950
  244.            MOV     AX,IMG_HEIGHT
  245.            CMP     UP,AX
  246.            JAE     CHK950
  247.            CMP     DOWN,AX
  248.            JB      CHK999
  249. CHK950:
  250.            MOV     BX,HANDLE_IN           ;CLOSE FILE
  251.            MOV     AH,3EH               ;
  252.            INT     21H               ;
  253.            MOV     DX,OFFSET SIZE_ERROR    ;
  254.            JMP     ERROR
  255. CHK999:
  256. ;┌─────────────────────────────────────────────────────────────────────────────┐
  257. ;│           CHECK FILE ACCESS DIRECTION                       │
  258. ;└─────────────────────────────────────────────────────────────────────────────┘
  259.            CMP     DOWN,0
  260.            JNE     CFA500
  261.            MOV     CX,IMG_HEIGHT
  262.            SUB     CX,UP
  263.            MOV     AX,UP               ;MOVE IMAGE UP
  264.            MUL     IMG_WIDTH_BYTE
  265.            ADD     READ_POINTER,AX
  266.            ADD     READ_POINTER+2,DX
  267. CFA100:
  268.            CALL    READ_LINE
  269.            CALL    HORIZ_ADJ
  270.            CALL    WRITE_LINE
  271.            MOV     AX,IMG_WIDTH_BYTE
  272.            ADD     READ_POINTER,AX
  273.            JNC     CFA200
  274.            INC     READ_POINTER+2
  275. CFA200:
  276.            ADD     WRITE_POINTER,AX
  277.            JNC     CFA300
  278.            INC     WRITE_POINTER+2
  279. CFA300:
  280.            LOOP    CFA100
  281.            MOV     CX,UP               ;PUT BLANK LINES
  282.            CMP     CX,0
  283.            JE      CFA999
  284.            CALL    CLEAR_BUFFER
  285. CFA400:
  286.            CALL    WRITE_LINE
  287.            ADD     WRITE_POINTER,AX
  288.            JNC     CFA450
  289.            INC     WRITE_POINTER+2
  290. CFA450:
  291.            LOOP    CFA400
  292.            JMP     SHORT CFA999
  293. CFA500:                        ;MOVE IMAGE DOWN
  294.  
  295.            MOV     AX,IMG_HEIGHT           ;LAST LINE IN FILE
  296.            MUL     IMG_WIDTH_BYTE
  297.            ADD     WRITE_POINTER,AX
  298.            ADD     WRITE_POINTER+2,DX
  299.  
  300.            MOV     AX,IMG_HEIGHT           ;ADJUST READ POINTER
  301.            SUB     AX,DOWN
  302.            MOV     CX,AX
  303.            MUL     IMG_WIDTH_BYTE
  304.            ADD     READ_POINTER,AX
  305.            ADD     READ_POINTER+2,DX
  306. CFA600:
  307.            CALL    READ_LINE
  308.            CALL    HORIZ_ADJ
  309.            CALL    WRITE_LINE
  310.  
  311.            MOV     AX,IMG_WIDTH_BYTE
  312.            SUB     READ_POINTER,AX
  313.            JNC     CFA700
  314.            DEC     READ_POINTER+2
  315. CFA700:
  316.            SUB     WRITE_POINTER,AX
  317.            JNC     CFA800
  318.            DEC     WRITE_POINTER+2
  319. CFA800:
  320.            LOOP    CFA600
  321.            MOV     CX,DOWN
  322.            CALL    CLEAR_BUFFER
  323. CFA900:
  324.            CALL    WRITE_LINE
  325.            SUB     WRITE_POINTER,AX
  326.            JNC     CFA950
  327.            DEC     WRITE_POINTER+2
  328. CFA950:
  329.            LOOP    CFA900
  330.  
  331. CFA999:
  332. ;┌─────────────────────────────────────────────────────────────────────────────┐
  333. ;│           CLOSE FILES                               │
  334. ;└─────────────────────────────────────────────────────────────────────────────┘
  335.            MOV     BX,HANDLE_IN           ;CLOSE FILE
  336.            MOV     AH,3EH               ;
  337.            INT     21H               ;
  338.            JMP     EXIT
  339. ERROR:
  340.            MOV     AX,CS
  341.            MOV     DS,AX
  342.            MOV     AH,9
  343.            INT     21H
  344. EXIT:
  345.            RET                   ;
  346. MOVE           ENDP
  347.  
  348. ;╔═════════════════════════════════════════════════════════════════════════════╗
  349. ;║ ░░░░░░░░░░░ GET NUMBER ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  350. ;╚═════════════════════════════════════════════════════════════════════════════╝
  351. ;┌─────────────────────────────────────────────────────────────────────────────┐
  352. ;│           GET NUMBER FOLLOWING COMMAND                       │
  353. ;└─────────────────────────────────────────────────────────────────────────────┘
  354. GET_NUMBER     PROC    NEAR
  355.  
  356.            PUSH    BX
  357.            MOV     BX,0
  358. GN100:
  359.            CMP     BYTE PTR [SI+BX],'0'
  360.            JB      GN200
  361.            CMP     BYTE PTR [SI+BX],'9'
  362.            JA      GN200
  363.            INC     BX
  364.            JMP     SHORT GN100
  365. GN200:
  366.            MOV     AX,BX
  367.            CALL    ASC2BIN
  368.            ADD     SI,BX
  369.            POP     BX
  370.            RET
  371.  
  372. GET_NUMBER     ENDP
  373. ;╔═════════════════════════════════════════════════════════════════════════════╗
  374. ;║ ░░░░░░░░░░░ ASCII TO BINARY ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  375. ;╚═════════════════════════════════════════════════════════════════════════════╝
  376. DIVISOR        DW      0,1
  377. TEN           DW      10,100,1000,10000
  378. ;┌─────────────────────────────────────────────────────────────────────────────┐
  379. ;│        DS:SI = START OF ASCII STRING                       │
  380. ;│           AX = NUMBER OF CHARACTER IN STRING (1-5)                │
  381. ;├─────────────────────────────────────────────────────────────────────────────┤
  382. ;│           AX = RETURNS BINARY NUMBER                       │
  383. ;└─────────────────────────────────────────────────────────────────────────────┘
  384.            PUBLIC  ASC2BIN
  385. ASC2BIN        PROC    NEAR
  386.  
  387.            PUSH    BX               ;SAVE REGISTERS
  388.            PUSH    CX               ;
  389.            PUSH    DX               ;
  390.            PUSH    SI               ;
  391.  
  392.            SHL     AX,1               ;MAKE INTO WORD OFFSET
  393.            MOV     BX,AX               ;
  394.            PUSH    SI               ;
  395.            MOV     SI,OFFSET DIVISOR       ;
  396.            MOV     CX,[SI+BX]           ;DIVISOR
  397.            POP     SI               ;
  398.            XOR     BX,BX               ;CLEAR BINARY HOLD REGISTER
  399.                            ;
  400. ASC100:                        ;
  401.            LODSB                   ;GET ASCII NUMBER
  402.            AND     AL,0FH               ;STRIP ASCII PART
  403.            XOR     AH,AH               ;
  404.            MUL     CX               ;
  405.            ADD     BX,AX               ;
  406.            CMP     CX,1               ;DONE?
  407.            JE      ASC300
  408.            MOV     AX,CX               ;GET DIVISOR
  409.            XOR     DX,DX               ;
  410.            DIV     TEN               ;DIVIDE IT BY TEN
  411.            MOV     CX,AX               ;PUT BACK IN DX
  412.            JMP     SHORT ASC100           ;
  413. ASC300:
  414.            MOV     AX,BX               ;PUT BINARY NUMBER IN AX
  415.            POP     SI               ;RESTORE REGISTERS
  416.            POP     DX               ;
  417.            POP     CX               ;
  418.            POP     BX               ;
  419.            RET
  420. ASC2BIN        ENDP
  421. ;╔═════════════════════════════════════════════════════════════════════════════╗
  422. ;║ ░░░░░░░░░░░ READ_LINE ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  423. ;╚═════════════════════════════════════════════════════════════════════════════╝
  424. READ_LINE      PROC    NEAR
  425.  
  426.            PUSH    BX
  427.            PUSH    CX
  428.            PUSH    DX
  429.            PUSH    DS
  430.            MOV     AL,0
  431.            MOV     AH,42H
  432.            MOV     BX,HANDLE_IN
  433.            MOV     DX,READ_POINTER
  434.            MOV     CX,READ_POINTER+2
  435.            INT     21H
  436.            MOV     AH,3FH
  437.            MOV     BX,HANDLE_IN
  438.            MOV     CX,IMG_WIDTH_BYTE
  439.            LDS     DX,DISK_BUFFER
  440.            INT     21H
  441.            POP     DS
  442.            POP     DX
  443.            POP     CX
  444.            POP     BX
  445.            RET
  446.  
  447. READ_LINE      ENDP
  448. ;╔═════════════════════════════════════════════════════════════════════════════╗
  449. ;║ ░░░░░░░░░░░ WRITE_LINE ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  450. ;╚═════════════════════════════════════════════════════════════════════════════╝
  451. WRITE_LINE     PROC    NEAR
  452.  
  453.            PUSH    BX
  454.            PUSH    CX
  455.            PUSH    DX
  456.            PUSH    DS
  457.            MOV     AL,0
  458.            MOV     AH,42H
  459.            MOV     BX,HANDLE_IN
  460.            MOV     DX,WRITE_POINTER
  461.            MOV     CX,WRITE_POINTER+2
  462.            INT     21H
  463.            MOV     AH,40H
  464.            MOV     BX,HANDLE_IN
  465.            MOV     CX,IMG_WIDTH_BYTE
  466.            LDS     DX,DISK_BUFFER
  467.            INT     21H
  468.            POP     DS
  469.            POP     DX
  470.            POP     CX
  471.            POP     BX
  472.            RET
  473.  
  474. WRITE_LINE     ENDP
  475. ;╔═════════════════════════════════════════════════════════════════════════════╗
  476. ;║ ░░░░░░░░░░░ HORIZ_ADJUST ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  477. ;╚═════════════════════════════════════════════════════════════════════════════╝
  478. HORIZ_ADJ      PROC    NEAR
  479.  
  480.  
  481.  
  482.            PUSH    AX
  483.            PUSH    BX
  484.            PUSH    CX
  485.            PUSH    DX
  486.            PUSH    DI
  487.            PUSH    SI
  488.            PUSH    DS
  489.            PUSH    ES
  490.  
  491.            CMP     LEFT,0
  492.            JE      HA500
  493.  
  494.            MOV     AX,LEFT
  495.            XOR     DX,DX
  496.            DIV     EIGHT               ;AX=NUMBER OF BYTES DX=PIXELS
  497.  
  498.            CLD
  499.            PUSH    DS
  500.            MOV     CX,IMG_WIDTH_BYTE
  501.            SUB     CX,AX
  502.            LES     DI,DISK_BUFFER
  503.            LDS     SI,DISK_BUFFER
  504.            MOV     SI,AX
  505.            REP     MOVSB               ;SHIFT BYTES FIRST
  506.            POP     DS
  507.  
  508.            MOV     CX,AX               ;CLEAR REMAINING BYTES
  509.            INC     CX
  510.            XOR     AL,AL
  511.            REP     STOSB
  512.  
  513.            MOV     CL,DL
  514.            MOV     DI,0
  515. HA200:
  516.            MOV     AX,ES:[DI]
  517.            XCHG    AH,AL
  518.            SHL     AX,CL
  519.            MOV     ES:[DI],AH
  520.            INC     DI
  521.            CMP     DI,IMG_WIDTH_BYTE
  522.            JNE     HA200
  523.            JMP     SHORT HA999           ;SHIFT PIXELS NEXT
  524. HA500:
  525.            CMP     RIGHT,0
  526.            JE      HA999
  527.  
  528.            MOV     AX,RIGHT
  529.            XOR     DX,DX
  530.            DIV     EIGHT               ;AX=NUMBER OF BYTES DX=PIXELS
  531.  
  532.            STD
  533.            PUSH    DS
  534.            MOV     CX,IMG_WIDTH_BYTE
  535.            SUB     CX,AX
  536.            LES     DI,DISK_BUFFER
  537.            LDS     SI,DISK_BUFFER
  538.            ADD     DI,CS:IMG_WIDTH_BYTE
  539.            ADD     SI,CS:IMG_WIDTH_BYTE
  540.            MOV     BYTE PTR ES:[DI+1],0
  541.            SUB     SI,AX
  542.            REP     MOVSB               ;SHIFT BYTES FIRST
  543.            POP     DS
  544.  
  545.            MOV     CX,AX               ;CLEAR REMAINING BYTES
  546.            XOR     AL,AL
  547.            REP     STOSB
  548.  
  549.            MOV     CL,DL
  550.            MOV     DI,IMG_WIDTH_BYTE
  551. HA800:
  552.            MOV     AX,ES:[DI]
  553.            XCHG    AH,AL
  554.            SHR     AX,CL
  555.            MOV     ES:[DI+1],AL
  556.            DEC     DI
  557.            JNZ     HA800
  558.  
  559.            CLD
  560. HA999:
  561.            POP     ES
  562.            POP     DS
  563.            POP     SI
  564.            POP     DI
  565.            POP     DX
  566.            POP     CX
  567.            POP     BX
  568.            POP     AX
  569.  
  570.            RET
  571.  
  572. HORIZ_ADJ      ENDP
  573. ;╔═════════════════════════════════════════════════════════════════════════════╗
  574. ;║ ░░░░░░░░░░░ CLEAR BUFFER░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  575. ;╚═════════════════════════════════════════════════════════════════════════════╝
  576. CLEAR_BUFFER   PROC    NEAR
  577.  
  578.            PUSH    AX
  579.            PUSH    CX
  580.            PUSH    DI
  581.            PUSH    ES
  582.  
  583.            XOR     AX,AX
  584.            MOV     CX,IMG_WIDTH_BYTE
  585.            LES     DI,DISK_BUFFER
  586.  
  587.            POP     ES
  588.            POP     DI
  589.            POP     CX
  590.            POP     AX
  591.            RET
  592.  
  593. CLEAR_BUFFER   ENDP
  594. ;╔═════════════════════════════════════════════════════════════════════════════╗
  595. ;╚═════════════════════════════════════════════════════════════════════════════╝
  596.            DB      64 DUP('STACK')
  597. STACK           EQU     $
  598. PROG_END       EQU     $
  599. ;╔═════════════════════════════════════════════════════════════════════════════╗
  600. ;╚═════════════════════════════════════════════════════════════════════════════╝
  601. CSEG           ENDS
  602.            END     MOVE
  603.